package com.syf.kit.soa.core.send.protocol.handle;

import cn.hutool.core.util.StrUtil;
import com.syf.kit.soa.core.SyfRpcMsg;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.MessageToByteEncoder;

import java.nio.charset.StandardCharsets;

public class RpcDataEncoder extends MessageToByteEncoder<SyfRpcMsg> {

    /**
     * 将SyfRpcMsg转换为byte buffer
     * <p>
     * 魔数（2byte） + 版本号（2byte）+ 请求类型（1byte）+ 业务报文类型（1byte） + 调用计数（4byte） + 请求uuid（8byte）
     * + 交易码(10byte) + 保留域（4byte） + 业务报文的byte长度（4byte） + 业务报文(n byte)
     */
    @Override
    protected void encode(ChannelHandlerContext ctx, SyfRpcMsg syfRpcMsg, ByteBuf byteBuf) throws Exception {
        // 魔数 2byte
        String magicNum = syfRpcMsg.getMagicNum();
        byteBuf.writeBytes(magicNum.getBytes(StandardCharsets.UTF_8), 0, 2);

        // 版本号 2byte
        byteBuf.writeBytes(syfRpcMsg.getVersion().getBytes(StandardCharsets.UTF_8), 0, 2);

        // 请求类型 1byte 0-心跳；1-request/response；2-trigger触发;
        byteBuf.writeByte(syfRpcMsg.getReqType());

        // 业务报文类型 1byte 1-json
        byteBuf.writeByte(syfRpcMsg.getBizDataType());

        // 调用计数,integer 4byte
        byteBuf.writeInt(syfRpcMsg.getCallCount());

        // 请求uuid
        byteBuf.writeLong(syfRpcMsg.getReqUUID());

        // 交易码，10byte
        String serviceCode = StrUtil.fillAfter(syfRpcMsg.getServiceCode(), ' ', 10);
        byteBuf.writeBytes(serviceCode.getBytes(StandardCharsets.UTF_8));

        // 保留域 4byte
        byteBuf.writeBytes(syfRpcMsg.getReserved());

        // 业务数据报文转byte数组
        byte[] bizDataBytes = syfRpcMsg.getBizData().getBytes(StandardCharsets.UTF_8);
        // 业务数据长度，integer，4byte
        byteBuf.writeInt(bizDataBytes.length);
        // 业务数据
        byteBuf.writeBytes(bizDataBytes);
    }
}
